package modules.future;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

/**
 * 异步回调
 *      使用：CompletableFuture
 * @author shengren.yan
 * @create 2021-04-04
 */
@SpringBootTest
public class CompletableFuture1 {


    // 没有返回值的runAsync异步回调
    @Test
    void test1() throws ExecutionException, InterruptedException {

        System.out.println(System.currentTimeMillis());
        System.out.println("---------------------");
        CompletableFuture<Void> future = CompletableFuture.runAsync(()->{
            //发起一个异步任务
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+".....");
        });

        System.out.println("111");
        System.out.println(System.currentTimeMillis());
        System.out.println("------------------------------");
        //输出执行结果
        System.out.println(future.get());  //获取执行结果
        System.out.println("22");

    }


    /*
      有返回值的异步回调supplyAsync
         whenComplete: 有两个参数，一个是t 一个是u
         T：是代表的 正常返回的结果；
         U：是代表的 抛出异常的错误信息；
         如果发生了异常，get可以获取到exceptionally返回的值；
     */
    @Test
    void test2() throws ExecutionException, InterruptedException {

        System.out.println(System.currentTimeMillis());
        System.out.println("---------------------");
        //有返回值的异步回调
        CompletableFuture<Integer> completableFuture=CompletableFuture.supplyAsync(()->{
            System.out.println(Thread.currentThread().getName());
            try {
                TimeUnit.SECONDS.sleep(2);
                //自定义手动的异常
                int i=1/0;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 1024;
        });

        System.out.println("111");
        System.out.println(completableFuture.whenComplete((t, u) -> {
            //success 回调
            System.out.println("t=>" + t); //正常的返回结果
            System.out.println("u=>" + u); //抛出异常的 错误信息
        }).exceptionally((e) -> {
            //error回调  如果异常，返回404
            System.out.println(e.getMessage());
            return 404;
        }).get());

    }


}
